package net.tv90.bfmccore.util;

import org.bukkit.entity.Player;
import org.bukkit.event.player.PlayerRespawnEvent;

import java.util.HashMap;
import java.util.Map;

import static net.tv90.bfmccore.helper.FactionHelper.getCountry2;

/**
 * 使用Map<String, Cooldown>来存储储存玩家游戏中各种操作的冷却时间，也可用于计时
 * 此Map的Key为自定义的名称，方便索引，可取名为”某操作“或”阵营_载具“等。
 * Value即为Cooldown类，该类的成员变量包含玩家，开始时间，持续秒钟，用于索引的名称
 * 使用本类时，先new出来Cooldown对象，随后根据不同需要(该冷却对玩家本身生效？对玩家所属整个阵营生效？对全服玩家生效?)启动计时
 * 使用
 * 在本类之外编写代码时，不需要对静态类cool进行任何操作
 */

public class Cooldown {

    //储存玩家游戏中各种操作的冷却时间
    private static Map<String, Cooldown> cool = new HashMap<>();
    //成员变量(开始时间，持续秒钟，名称，玩家)
    private long start;
    private int second;
    private String name;
    private Player p;

    /** 构造器
     *
     * @param name 冷却命名
     * @param second 冷却秒钟
     * @param p 玩家
     */
    public Cooldown(String name, int second, Player p) {
        this.name = name;
        this.second = second;
        this.p = p;
    }

    /**
     *
     * @param path 命名 如：RU_JET_TV90 阵营_载具_玩家
     * @return 根据HashMap的Key值返回Cooldown类
     */
    public static Cooldown getCooldownSecond(String path) {
        if (!cool.containsKey(path)) {
            return null;
        }
        return cool.get(path);
    }

    /** 获取单个玩家的冷却时间
     *
     * @param name 命名 如：单个玩家阵营和载具 getFactionVehicle(Player p)
     * @param p 玩家
     * @return 玩家处于冷却的时间
     */
    public static int getTime(String name, Player p) {
        //例 K = RU_JET_TV90 , V = 10
        Cooldown cd = getCooldownSecond(name + "_" + p.getName());
        if (cd == null) {
            return -1;
        }
        return cd.second - (int) (System.currentTimeMillis() - cd.start) / 1000;
    }

    /** 获取单个玩家是否处于冷却状态
     *
     * @param name 命名 如：单个玩家阵营和载具 getFactionVehicle(Player p)
     * @param p 玩家
     * @return 检测玩家是否仍在冷却中 如果在，返回真  如果不在，remove并返回假
     */
    public static boolean isCool(String name, Player p) {
        if (getTime(name, p) >= 1) {
            return true;
        } else {
            cool.remove(name + "_" + p.getName());
            return false;
        }
    }

    /**
     * 移除该玩家的冷却
     * @param name 命名
     * @param p 玩家
     */
    public static void remove(String name, Player p){
        cool.remove(name + "_" + p.getName());
    }

    //玩家自身冷却开始计时
    public void startForSinglePlayer() {
        this.start = System.currentTimeMillis();
        cool.put(name + "_" + p.getName(), this);
    }

    //阵营冷却开始计时
    public void startForFaction() {
        this.start = System.currentTimeMillis();
        cool.put(name+ "_" + getCountry2(p), this);
    }

    //全服玩家冷却开始计时
    public void startForAllPlayers() {
        this.start = System.currentTimeMillis();
        cool.put(name+ "_ALL", this);
    }

    public String getName(){
        return this.name;
    }

    public int getSecond(){
        return this.second;
    }

    @Override
    public String toString() {
        return "Cooldown{" + "start=" + start + ", second=" + second + ", name='" + name + ", p=" + p.getName() + '}';
    }
}
